/*
 * @Author: aggfb 714740235@qq.com
 * @Date: 2024-06-08 19:19:05
 * @LastEditors: aggfb 714740235@qq.com
 * @LastEditTime: 2024-06-09 20:21:47
 * @FilePath: \ft_fan\User\Source\Application\main.c
 * @Description: 这是默认设置,请设置`customMade`, 打开koroFileHeader查看配置 进行设置: https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
 */

#include <FU68xx_4.h>
#include <MyProject.h>
#include "FU68xx_Sys.h"

static void HardwareInit(void);
static void SoftwareInit(void);

void main(void)
{
    uint16 times = 0;
    uint16 power_up_cnt = 0;

    /* 复位状态寄存器 */
    RST_SR &= 0xFE;
    for (power_up_cnt = 0; power_up_cnt < SystemPowerUpTime; power_up_cnt++)
    {
        ;
    }  

    /* 配置参考电压输出 <未理解> */
    ClrBit(P3_AN, PIN5);                     // VREF Voltage -->P35 Output
    ClrBit(VREF_VHALF_CR, VRVSEL1);          // 00-->4.5V   01-->VDD5
    SetBit(VREF_VHALF_CR, VRVSEL0);          // 10-->3.0V   11-->4.0V
    SetBit(VREF_VHALF_CR, VREFEN | VHALFEN); // VREF_VHALF_CR = 0x11;

    /* 硬件资源 和 软件资源初始化 */
    HardwareInit();
    SoftwareInit();
    
    /* wifi初始化 */
    wifi_protocol_init();
    
    /*******************Observation signal Select*********************/
    SetReg(CMP_CR3, DBGSEL0 | DBGSEL1, GP01_DBG_Conf);
    SetReg(CMP_CR3, CMPSEL0 | CMPSEL1 | CMPSEL2, GP07_DBG_Conf);

    MotorStatusRead();
    IRControl.FlagUserCodeRead = 1;
    while (1)
    {
        /* WIFI数据处理 */
        wifi_uart_service();
        
        /* 电流矫正 */
        if ((mcCurOffset.OffsetFlag == 0) && (Time.PowerUpTimeCount > 1000))
        {
            GetCurrentOffset();
        }
        else if (mcCurOffset.OffsetFlag == 1)
        {
            MotorStatusSave();
            /* 状态机控制 */
            MC_Control();

            UserCodeDeal();
        }

        /* 速度测试 */
        #if 0
        if(++times > 60000)
        {
            times = 0;
            SetSpeed(4);
        }
        #endif
    }
}

/*-------------------------------------------------------------------------------------------------
    Function Name : void HardwareInit(void)
    Description   : 硬件初始化，初始化需要使用的硬件设备配置，
                    FOC必须配置的是：
                    1.运放电压
                    2.运放初始化
                    3.ADC初始化
                    4.Driver初始化
                    5.其他的可根据实际需求加
    Input         : 无
    Output        : 无
-------------------------------------------------------------------------------------------------*/
static void HardwareInit(void)
{
    /* 默认配置输出上拉 */
    //GPIO_Default_Init();

    GPIO_Init(); // 功能IO初始化
    ADC_Init();  // ADC初始化

    /*********硬件FO过流，比较器初始化，用于硬件过流比较保护*********/
    CMP3_Init();

    Driver_Init();         // Driver初始化
    CMP3_Interrupt_Init(); // 比较器中断配置，建议和比较器初始化间隔一段时间
    AMP_Init();            // 运算放大器初始化

    TIM1ms_Init(); // 采用1ms定时器中断作为常见中断,处理故障保护等附加功能

    TIM4_Init();
    TIM3_Init_RF();

    UART2_Init();
}

/*-------------------------------------------------------------------------------------------------
    Function Name : void SoftwareInit(void)
    Description   : 软件初始化，初始化所有定义变量，按键初始化扫描
    Input         : 无
    Output        : 无
-------------------------------------------------------------------------------------------------*/
static void SoftwareInit(void)
{
    MotorcontrolInit();

    mcState = mcReady;
    mcFaultSource = 0;
    IRInit(); // IR初始化
    IRControl.ONOFFStatus = 1;
}
